[Design Pattern] Memento

[디자인 패턴][행위 패턴] 메멘토

Posted by ChaelinJ on May 07, 2021

Memento

객체의 상태 정보를 저장하고 사용자의 필요에 의하여 원하는 시점의 데이터를 복원할 수 있는 패턴

  • 객체 내부 상태정보만 가지는 클래스를 따로 생성하여 관리하는 구조
  • 저장할 상태정보가 많을 경우 성능에 문제가 될 수 있음

다이어그램

  • Originator: 메멘토를 생성하여 현재 객체 상태를 저장하고 내부 상태를 복구하는 클래스
  • Memento: Originator 객체의 내부 상태를 저장합니다. Originator 객체를 제외한 다른 객체는 Memento 클래스에 접근할 수 없습니다.
  • CareTaker: 메멘토의 보관을 책임지나 메멘토의 내용을 확인하거나 처리하지 않습니다.

  • CareTaker는 메멘토 전달을 위해 이용하는 클래스이고, Originator 처럼 메멘토 내부에 접근할 권한은 없습니다.

예제 및 이해

  • CareTaker에서 Stack을 가지고 상태를 저장해서 이전 상태로 돌리게 하였습니다.
    • 특정 상태로 돌아가고자 한다면 다른 형태(List)를 사용해 index를 이용해도 됩니다.
    • Stack을 Pop해서 가져와 이전으로 돌아가면서 현재 상태는 삭제 되도록 하였습니다.
  • Originator의 saveStateToMemento을 통해 현재 state를 Memento에 저장하고 해당 Memento 객체를 return 합니다.
  • Originator의 getStateFromMemento을 통해 Memento 객체를 받아 현재 state를 Memento 객체에서 받아옵니다.

Memento

Originator

CareTaker

Main

출력

=======상태 저장=======
01 상태
02 상태
03 상태
=======이전 상태 호출=======
03 상태
02 상태
01 상태

저장된 상태를 FILO 형태로 받아옵니다.

어쨌든 상태를 stack에 저장하기 때문에 저장 공간이 많이 사용될 수 있습니다.

장단점

장점

  • 핵심 객체의 정보를 캡슐화 된 상태로 유지할 수 있습니다.
  • 저장된 상태를 다른 별도의 객체에 보관하기 때문에 안전합니다.
  • 복구 기능을 쉽게 구현할 수 있습니다.

단점

  • 상태를 저장하고 복구하는데 시간이 오래 걸릴 수 있습니다.
  • 상태를 저장하기 위해 메멘토 객체를 이용해야 합니다.
  • 자바 시스템에서는 시스템의 상태를 저장할 때 직렬화를 사용하는 것이 좋습니다.

참조

감사합니다.

Text by Chaelin. Photographs by Chaelin, Unsplash.